//////////////////////////////////////////////////////////////////////
//                                                                  //
//                                                                  //
//              Copyright (C), 2000  SEIKO EPSON Corp.              //
//              ALL RIGHTS RESERVED                                 //
//                                                                  //
//                                                                  //
//   file name : floor.c                                            //
//                                                                  //
//   Revision history                                               //
//       00/02/10    first release                 M.Igarashi       //
//                                                                  //
//////////////////////////////////////////////////////////////////////


#include	<math.h>
#include <smcvals.h>

// ALGORITHM
// 1.separate x to fraction part and exponent part
//   if x<0 modf( -x, &x ) else modf( x, &x )
// 2.if modf( -x, &x ) is not 0 is round up
//


//  the architecture of double floating point
//
//   0 1          11                  31 32                               63bit
//   -----------------------------------------------------------------------
//  | |   exponent  |                    fraction                           |
//   -----------------------------------------------------------------------
//  |               |                   |                                   |
//  |     12bits          20 bits       |             32 bits               |
//  |            lower word             |            higher word            |
//
//         bit    0         sign bit         (  1 bit  )
//              1 - 11      exponent part    ( 11 bits )
//             12 - 63      fraction part    ( 52 bits )
//
//

double floor(double dfX){

	long lX;
	double dfX2,dfX3,dfRet;
	
	GETW_L(lX,dfX);		// get low
	
	if ( (lX&0x80000000) !=0x0){
		CLR_SIGN( dfX2,dfX );		// clear sign
		if(modf(dfX2,&dfX3) !=0.0){
			dfX3+=1.0;			// -0.1 -> -1
		}
		SET_SIGN(dfRet,dfX3);	// set sign
	}else{
		modf(dfX,&dfRet);
	}

	return dfRet;
}
